<template>
  <div id="app">
    <!-- 登录页面 -->
    <div id="login" v-if="!isLogin">
      <div id="flower"></div>
      <div id="loginContent">
        <div id="text">全国疫情可视化平台</div>
        <el-form
          :model="form"
          :rules="rules"
          ref="ruleForm"
          label-width="100px"
        >
          <el-form-item label="用户名" prop="username">
            <el-input v-model="form.username" style="opacity: 0.5"></el-input>
          </el-form-item>
          <el-form-item label="密码" prop="password">
            <el-input
              type="password"
              v-model="form.password"
              autocomplete="off"
              style="opacity: 0.5"
            ></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="toLogin('ruleForm')"
              >登录</el-button
            >
          </el-form-item>
        </el-form>
      </div>
      <!--  -->
      <!-- <div id="login"> -->
      <!--  -->
      <!-- <button @click="isLogin=true">跳转</button> -->
      <!-- </div> -->
    </div>

    <div v-else>
      <el-container>
        <el-header>
          老林哥家的米粉团

          <el-button type="info" round class="button" @click="logindwon()"
            >退出登录</el-button
          >
        </el-header>
        <el-container>
          <el-aside width="200px">
            <!-- 在el-menu上写了router之后启动路由，内部的index属性代表导航打开的路由，注意路由对应的页面是在src/router/index.js中配置的 -->
            <el-menu
              :default-active="active"
              class="el-menu-vertical-demo"
              @open="handleOpen"
              @close="handleClose"
              background-color="#f0ecec"
              :collapse="isCollapse"
              router
            >
              <!-- text-color="#black"
              active-text-color="rgb(243, 94, 193)" -->
              <el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
                <el-radio-button :label="false">展开</el-radio-button>
                <el-radio-button :label="true">收起</el-radio-button>
              </el-radio-group>
              <el-menu-item index="/">
                <i class="el-icon-menu"></i>
                <span slot="title">疫情动态</span>
              </el-menu-item>
              <el-menu-item index="/map">
                <i class="el-icon-menu"></i>
                <span slot="title">疫情地图</span>
              </el-menu-item>
              <el-menu-item index="/science">
                <i class="el-icon-menu"></i>
                <span slot="title">疫情科普</span>
              </el-menu-item>
              <el-menu-item index="/current">
                <i class="el-icon-menu"></i>
                <span slot="title">实时疫情</span>
              </el-menu-item>
              <el-menu-item index="/count">
                <i class="el-icon-menu"></i>
                <span slot="title">数据统计</span>
              </el-menu-item>
              <el-menu-item index="/hosp">
                <i class="el-icon-menu"></i>
                <span slot="title">定点医院</span>
              </el-menu-item>
              <el-menu-item index="/userechart">
                <i class="el-icon-menu"></i>
                <span slot="title">用户数据图表</span>
              </el-menu-item>
              <el-menu-item index="/usermanage">
                <i class="el-icon-menu"></i>
                <span slot="title">用户管理</span>
              </el-menu-item>
              <el-submenu index="2">
                <template slot="title">
                  <i class="el-icon-location"></i>
                  <span>疫情管理</span>
                </template>
                <el-menu-item index="/hospital">定点医院</el-menu-item>
                <el-menu-item index="/infoList">资讯分类</el-menu-item>
                <el-menu-item index="/article">新闻资讯</el-menu-item>
              </el-submenu>

              <el-submenu index="3">
                <template slot="title">
                  <i class="el-icon-menu"></i>
                  <span>疫情数据</span>
                </template>
                <el-menu-item index="/list">数据列表</el-menu-item>
                <el-menu-item index="/up">数据上报</el-menu-item>
              </el-submenu>
            </el-menu>
          </el-aside>
          <el-main>
            <!-- 路由对应的组件展示的位置 -->
            <div>
              <router-view></router-view>
            </div>
          </el-main>
        </el-container>
      </el-container>
    </div>
  </div>
</template>

<script>
// vuex  状态机  处理组件公用的数据
// h5  sessionStorage 在登录页面点击登录按钮的时候，存token数据到sessionStorage，其他页面如果要用token数据，从sessionStorage里取
import axios from "./utils/request";
import $ from "jquery";
export default {
  name: "app",
  data() {
    return {
      isCollapse: true,
      active: "/",
      isLogin: sessionStorage.getItem("token"),
      form: {},
      rules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
        ],
        password: [{ required: true, message: "请输入密码", trigger: "blur" }],
      },
    };
  },
  mounted() {},
  created() {
    this.active = location.pathname;
    this.showFlower();
    // console.log(location.pathname, "=====");
    // console.log(this.$route, "000");
  },
  methods: {
    /* logout() {
      //退出功能
      //弹出确认对话框
      //用户点击确认，跳回用户登录页面，清除token
      this.$confirm("确定要退出登录吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          this.$message({
            type: "success",
            message: "退出成功!",
          });
          //确认退出，清除token
          localStorage.removeItem("token");
          //跳转登录页面(编程式导航)
          this.$router.push("/login");
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消退出",
          });
        });
    }, */
    //登录
    // 花瓣
    showFlower() {
      var RENDERER = {
        INIT_CHERRY_BLOSSOM_COUNT: 30,
        MAX_ADDING_INTERVAL: 10,

        init: function () {
          this.setParameters();
          this.reconstructMethods();
          this.createCherries();
          this.render();
        },
        setParameters: function () {
          this.$container = $("#flower");
          this.width = this.$container.width();
          this.height = this.$container.height();
          this.context = $("<canvas />")
            .attr({ width: this.width, height: this.height })
            .appendTo(this.$container)
            .get(0)
            .getContext("2d");
          this.cherries = [];
          this.maxAddingInterval = Math.round(
            (this.MAX_ADDING_INTERVAL * 1000) / this.width
          );
          this.addingInterval = this.maxAddingInterval;
        },
        reconstructMethods: function () {
          this.render = this.render.bind(this);
        },
        createCherries: function () {
          for (
            var i = 0,
              length = Math.round(
                (this.INIT_CHERRY_BLOSSOM_COUNT * this.width) / 1000
              );
            i < length;
            i++
          ) {
            this.cherries.push(new CHERRY_BLOSSOM(this, true));
          }
        },
        render: function () {
          requestAnimationFrame(this.render);
          this.context.clearRect(0, 0, this.width, this.height);

          this.cherries.sort(function (cherry1, cherry2) {
            return cherry1.z - cherry2.z;
          });
          for (var i = this.cherries.length - 1; i >= 0; i--) {
            if (!this.cherries[i].render(this.context)) {
              this.cherries.splice(i, 1);
            }
          }
          if (--this.addingInterval == 0) {
            this.addingInterval = this.maxAddingInterval;
            this.cherries.push(new CHERRY_BLOSSOM(this, false));
          }
        },
      };
      var CHERRY_BLOSSOM = function (renderer, isRandom) {
        this.renderer = renderer;
        this.init(isRandom);
      };
      CHERRY_BLOSSOM.prototype = {
        FOCUS_POSITION: 300,
        FAR_LIMIT: 600,
        MAX_RIPPLE_COUNT: 100,
        RIPPLE_RADIUS: 100,
        SURFACE_RATE: 0.5,
        SINK_OFFSET: 20,

        init: function (isRandom) {
          this.x = this.getRandomValue(
            -this.renderer.width,
            this.renderer.width
          );
          this.y = isRandom
            ? this.getRandomValue(0, this.renderer.height)
            : this.renderer.height * 1.5;
          this.z = this.getRandomValue(0, this.FAR_LIMIT);
          this.vx = this.getRandomValue(-2, 2);
          this.vy = -2;
          this.theta = this.getRandomValue(0, Math.PI * 2);
          this.phi = this.getRandomValue(0, Math.PI * 2);
          this.psi = 0;
          this.dpsi = this.getRandomValue(Math.PI / 600, Math.PI / 300);
          this.opacity = 0;
          this.endTheta = false;
          this.endPhi = false;
          this.rippleCount = 0;

          var axis = this.getAxis(),
            theta =
              this.theta +
              (Math.ceil(
                -(this.y + this.renderer.height * this.SURFACE_RATE) / this.vy
              ) *
                Math.PI) /
                500;
          theta %= Math.PI * 2;

          this.offsetY =
            40 * (theta <= Math.PI / 2 || theta >= (Math.PI * 3) / 2 ? -1 : 1);
          this.thresholdY =
            this.renderer.height / 2 +
            this.renderer.height * this.SURFACE_RATE * axis.rate;
          this.entityColor = this.renderer.context.createRadialGradient(
            0,
            40,
            0,
            0,
            40,
            80
          );
          this.entityColor.addColorStop(
            0,
            "hsl(330, 70%, " + 50 * (0.3 + axis.rate) + "%)"
          );
          this.entityColor.addColorStop(
            0.05,
            "hsl(330, 40%," + 55 * (0.3 + axis.rate) + "%)"
          );
          this.entityColor.addColorStop(
            1,
            "hsl(330, 20%, " + 70 * (0.3 + axis.rate) + "%)"
          );
          this.shadowColor = this.renderer.context.createRadialGradient(
            0,
            40,
            0,
            0,
            40,
            80
          );
          this.shadowColor.addColorStop(
            0,
            "hsl(330, 40%, " + 30 * (0.3 + axis.rate) + "%)"
          );
          this.shadowColor.addColorStop(
            0.05,
            "hsl(330, 40%," + 30 * (0.3 + axis.rate) + "%)"
          );
          this.shadowColor.addColorStop(
            1,
            "hsl(330, 20%, " + 40 * (0.3 + axis.rate) + "%)"
          );
        },
        getRandomValue: function (min, max) {
          return min + (max - min) * Math.random();
        },
        getAxis: function () {
          var rate = this.FOCUS_POSITION / (this.z + this.FOCUS_POSITION),
            x = this.renderer.width / 2 + this.x * rate,
            y = this.renderer.height / 2 - this.y * rate;
          return { rate: rate, x: x, y: y };
        },
        renderCherry: function (context, axis) {
          context.beginPath();
          context.moveTo(0, 40);
          context.bezierCurveTo(-60, 20, -10, -60, 0, -20);
          context.bezierCurveTo(10, -60, 60, 20, 0, 40);
          context.fill();

          for (var i = -4; i < 4; i++) {
            context.beginPath();
            context.moveTo(0, 40);
            context.quadraticCurveTo(i * 12, 10, i * 4, -24 + Math.abs(i) * 2);
            context.stroke();
          }
        },
        render: function (context) {
          var axis = this.getAxis();

          if (
            axis.y == this.thresholdY &&
            this.rippleCount < this.MAX_RIPPLE_COUNT
          ) {
            context.save();
            context.lineWidth = 2;
            context.strokeStyle =
              "hsla(0, 0%, 100%, " +
              (this.MAX_RIPPLE_COUNT - this.rippleCount) /
                this.MAX_RIPPLE_COUNT +
              ")";
            context.translate(
              axis.x +
                this.offsetY * axis.rate * (this.theta <= Math.PI ? -1 : 1),
              axis.y
            );
            context.scale(1, 0.3);
            context.beginPath();
            context.arc(
              0,
              0,
              (this.rippleCount / this.MAX_RIPPLE_COUNT) *
                this.RIPPLE_RADIUS *
                axis.rate,
              0,
              Math.PI * 2,
              false
            );
            context.stroke();
            context.restore();
            this.rippleCount++;
          }
          if (axis.y < this.thresholdY || !this.endTheta || !this.endPhi) {
            if (this.y <= 0) {
              this.opacity = Math.min(this.opacity + 0.01, 1);
            }
            context.save();
            context.globalAlpha = this.opacity;
            context.fillStyle = this.shadowColor;
            context.strokeStyle =
              "hsl(330, 30%," + 40 * (0.3 + axis.rate) + "%)";
            context.translate(
              axis.x,
              Math.max(axis.y, this.thresholdY + this.thresholdY - axis.y)
            );
            context.rotate(Math.PI - this.theta);
            context.scale(axis.rate * -Math.sin(this.phi), axis.rate);
            context.translate(0, this.offsetY);
            this.renderCherry(context, axis);
            context.restore();
          }
          context.save();
          context.fillStyle = this.entityColor;
          context.strokeStyle = "hsl(330, 40%," + 70 * (0.3 + axis.rate) + "%)";
          context.translate(
            axis.x,
            axis.y + Math.abs(this.SINK_OFFSET * Math.sin(this.psi) * axis.rate)
          );
          context.rotate(this.theta);
          context.scale(axis.rate * Math.sin(this.phi), axis.rate);
          context.translate(0, this.offsetY);
          this.renderCherry(context, axis);
          context.restore();

          if (this.y <= -this.renderer.height / 4) {
            if (!this.endTheta) {
              for (
                var theta = Math.PI / 2, end = (Math.PI * 3) / 2;
                theta <= end;
                theta += Math.PI
              ) {
                if (this.theta < theta && this.theta + Math.PI / 200 > theta) {
                  this.theta = theta;
                  this.endTheta = true;
                  break;
                }
              }
            }
            if (!this.endPhi) {
              for (
                var phi = Math.PI / 8, end = (Math.PI * 7) / 8;
                phi <= end;
                phi += (Math.PI * 3) / 4
              ) {
                if (this.phi < phi && this.phi + Math.PI / 200 > phi) {
                  this.phi = Math.PI / 8;
                  this.endPhi = true;
                  break;
                }
              }
            }
          }
          if (!this.endTheta) {
            if (axis.y == this.thresholdY) {
              this.theta +=
                (Math.PI / 200) *
                (this.theta < Math.PI / 2 ||
                (this.theta >= Math.PI && this.theta < (Math.PI * 3) / 2)
                  ? 1
                  : -1);
            } else {
              this.theta += Math.PI / 500;
            }
            this.theta %= Math.PI * 2;
          }
          if (this.endPhi) {
            if (this.rippleCount == this.MAX_RIPPLE_COUNT) {
              this.psi += this.dpsi;
              this.psi %= Math.PI * 2;
            }
          } else {
            this.phi += Math.PI / (axis.y == this.thresholdY ? 200 : 500);
            this.phi %= Math.PI;
          }
          if (this.y <= -this.renderer.height * this.SURFACE_RATE) {
            this.x += 2;
            this.y = -this.renderer.height * this.SURFACE_RATE;
          } else {
            this.x += this.vx;
            this.y += this.vy;
          }
          return (
            this.z > -this.FOCUS_POSITION &&
            this.z < this.FAR_LIMIT &&
            this.x < this.renderer.width * 1.5
          );
        },
      };
      $(function () {
        RENDERER.init();
      });
    },
    toLogin(formName) {
      this.$refs[formName].validate(async (valid) => {
        // 校验通过
        if (valid) {
          let res = await axios.post("/user/login", this.form);
          if (res.status == 200) {
            // 存token到sessionStorage中
            sessionStorage.setItem("token", res.data.token);
            this.isLogin = true;
          } else {
            //提示登录失败的信息
            this.$notify.error({
              title: "错误",
              message: res.statusText,
            });
          }
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },

    handleOpen(key, keyPath) {
      console.log(key, keyPath);
    },
    handleClose(key, keyPath) {
      console.log(key, keyPath);
    },
  },
};
</script>

<style>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}
body {
  background-color: transparent;
}
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  opacity: 1;
  /* color: #2c3e50;
  margin: 0;
  padding: 0;
  height: 100%;
  text-align: left; */
}

.el-header {
  font-size: 30px;
  background-image: url("../static/xingkong.gif");
  /* background-size: 100%; */
  color: rgb(255, 255, 255);
  line-height: 60px;
}

.el-aside {
  /* background-image: url("../static/xingkong.gif"); */
  background-color: #f0ecec;
  /* color: rgb(243, 94, 193); */
  /* line-height: 200px; */
  height: calc(100vh - 60px);
  min-height: 500px;
}

.el-main {
  /* background-color: #e6f2f2; */
  background-color: #f0ecec;
  /* background-image: url("../static/xingkong.gif"); */
  color: #333;
  /* line-height: 160px; */
  height: calc(100vh - 60px);
  min-height: 500px;
  padding: 10px !important;
}
.el-main > div {
  /* background-color: rgb(252, 216, 227); */
  background-image: url("../static/pink1.gif");
  /* background-size: 50% 50%; */

  border-radius: 10px;
  min-height: calc(100% - 40px);
  padding: 20px;
}
#login {
  /* margin-top: 240px;
  margin-bottom: 130px;
  margin-left: 280px;
  margin-right: 350px; */
  /* height: 150vh; */
  /* background: transparent; */
  /* background-color: #000000; */
}
#text {
  background: transparent;
  /* margin-top: -60px;
  margin-bottom: 60px;
  margin-left: 230px; */
  font-size: 26px;
  color: white;
  margin-bottom: 80px;
  margin-left: 250px;
  /* text-align: center; */
}
#flower {
  height: 150vh;
  background-color: #000000;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
}
#loginContent {
  /* height: 100vh; */
  position: absolute;
  top: 40px;
  left: 200px;
  width: 50%;
}
.button {
  position: absolute;
  right: 10px;
  top: 10px;
}
</style>
